<?php

/**
 * ModelCommander es la clase padre de los modelos en el frame
 * Extiende de active record
 * @author Robert Babilonia <bobbabilon2@gmail.com>
 * 
 * 
 */
abstract class CommanderModel extends ActiveRecord\Model {
    /**
     *  Especifica el nombre de la tabla suponiendo que no sea igual que el del modelo
     */
    //static $table_name = 'tabla';

    /**
     *
     * @var string $primary_key Especifica el nombre para el campo calve de la tabla
     */
    static $primary_key = DB_PRIMARY_KEY;

    /**
     *
     * @var string $connection Especifica el tipo de conexion a usar: production o development
     */
    static $connection = DB_CONN;

    /**
     * Obtiene el primer registro de una tabla, si recibe el array conditions 
     * filtra segun esos parametros
     * @param array $conditions arreglo asociativo con las opciones de filtrado 
     * @return ActiveRecord object
     */
    public final function find_first($conditions = array()) {

        return $this->find("first", $conditions);
    }

    /**
     * Obtiene todos los registros de una tabla, si recibe el array conditions 
     * filtra segun esos parametros
     * @param array $conditions arreglo asociativo con las opciones de filtrado 
     * @return ArrayObject Arreglo de objetos ActiveRecord
     */
    public final function find_all($conditions = array()) {

        return $this->find("all", $conditions);
    }

    /**
     * Permite obtener datos de registros para logs de seguridad
     * Al estar en el la clase pincipal no será necesario especificar en los distintos
     * modelos el registro de logs.
     * 
     */
    protected final function get_logs($operacion) {


        $fecha = date(CommanderApp::get_config('DATE_FORMAT'));
        $hora = date(CommanderApp::get_config('TIME_FORMAT'));
        $modelo = $this->table()->table; //se obtiene el nombre del modelo ejecutado
        $client_data = new ClientData();

        CommanderLogger::notice_log("Fecha:$fecha", LOG_AUDITOR);
        CommanderLogger::notice_log("Hora:$hora", LOG_AUDITOR);
        CommanderLogger::notice_log("Modelo:$modelo", LOG_AUDITOR);
        CommanderLogger::notice_log("ID Afectado:" . $this->id, LOG_AUDITOR);
        /**
         * La identificacion de la operacion que se realiza:
         * A: Actualizacion
         * I: Insercion
         * E: Eliminacion
         */
        CommanderLogger::notice_log("Operacion:" . $operacion, LOG_AUDITOR);
        CommanderLogger::notice_log("IP:" . $client_data->getIp(), LOG_AUDITOR);
        CommanderLogger::notice_log("ISP:" . $client_data->getIsp(), LOG_AUDITOR);
        CommanderLogger::notice_log("SQL:" . $this->table()->last_sql, LOG_AUDITOR);
        CommanderLogger::notice_log("Valores:" . implode(', ', $this->table()->last_values), LOG_AUDITOR);


        if (SECURE_USER_BUGS) {

            /**
             * Se obtienen de variables de sesion informaciones del cliente utilizado
             */
            CommanderLogger::notice_log("Navegador:" . CommanderSession::get("navegador"), LOG_AUDITOR);
            CommanderLogger::notice_log("Tipo:" . CommanderSession::get("tipo"), LOG_AUDITOR);
            CommanderLogger::notice_log("Version:" . CommanderSession::get("version"), LOG_AUDITOR);
            CommanderLogger::notice_log("Plataforma:" . CommanderSession::get("plataforma"), LOG_AUDITOR);
            CommanderLogger::notice_log("Resolucion:" . CommanderSession::get("resolucion"), LOG_AUDITOR);
        }
    }

    /**
     * Metodo callback ejecutado despues de cualquier actualizacion con Activerecord
     */
    public final function after_update() {


        if (SECURE_MODELS_BUGS) {

            CommanderLogger::jump_log(LOG_AUDITOR);
            CommanderLogger::notice_log("Se realiza una actualizacion", LOG_AUDITOR);
            $this->get_logs('A');
            CommanderLogger::jump_log(LOG_AUDITOR);
        }
    }

    /**
     * Metodo callback ejecutado despues de cualquier insercion con Activerecord
     */
    public final function after_create() {


        if (SECURE_MODELS_BUGS) {

            CommanderLogger::jump_log(LOG_AUDITOR);
            CommanderLogger::notice_log("Se realiza una insercion", LOG_AUDITOR);
            $this->get_logs('I');
            CommanderLogger::jump_log(LOG_AUDITOR);
        }
    }

    /**
     * Metodo callback ejecutado despues de cualquier eliminacion con Activerecord
     */
    public final function after_destroy() {

        if (SECURE_MODELS_BUGS) {

            CommanderLogger::jump_log(LOG_AUDITOR);
            CommanderLogger::notice_log("Se elimina un registro", LOG_AUDITOR);
            $this->get_logs('E');
            CommanderLogger::jump_log(LOG_AUDITOR);
        }
    }

   

}

?>